#ifndef __Tiny_midware__src__log_h__
#define __Tiny_midware__src__log_h__

/**
 * 版权所有：(C)飞天诚信科技股份有限公司
 * 文件名称：log.h
 * 文件标识：Tiny_midware
 * 内容摘要：Android / IOS 统一的输出宏定义
 * 当前版本：1.0.0
 * 作    者：张晓光
 * 完成日期：2015/6/19
 */

#define ANDROID
#ifdef ANDROID
#include <jni.h>
#include <android/log.h>
#include <ctype.h>
#include <stdio.h>
#include <cstring>
#endif

#include <stdio.h>
#include <time.h>
#include <sys/time.h>

#define DEBUG
#if defined (DEBUG)

#ifdef ANDROID
/**
 * Android JNI printf 定义为空
 */
#define FT_PRINTE(...) {                                                            \
    ((void)__android_log_print(ANDROID_LOG_ERROR, "FTSafe P11 Err",  __VA_ARGS__)); \
}

#define FT_PRINTI(...) {                                                            \
    ((void)__android_log_print(ANDROID_LOG_INFO, "FTSafe P11 info",  __VA_ARGS__));  \
}
#else	/* ifdef(_ENABLE_ANDROID_) */
/**
 * IOS 平台 可直接使用printf打印日志信息
 */
#define FT_PRINTE(...) printf(__VA_ARGS__);
#define FT_PRINTI(...) printf(__VA_ARGS__);

#endif  /* ifdef(_ENABLE_ANDROID_) */

#define printfI(...) {               \
    printfTime();                    \
    FT_PRINTI(__VA_ARGS__);          \
}

#define printfE(...) {               \
    printfTime();                    \
    FT_PRINTE(__VA_ARGS__);          \
}

//whl 20200701 替换为snprintf
#define printfTime() {                                                              \
    struct timeval timeS;                                                           \
    gettimeofday( &timeS, NULL );                                                   \
    struct tm *TM = gmtime(&timeS.tv_sec);                                          \
    char buff[30] = {0};                                                            \
    snprintf(buff,sizeof(buff)/sizeof(char), "[%04d-%02d-%02d %02d:%02d:%02d.%06ld]", (int)TM->tm_year + 1900, \
        (int)TM->tm_mon + 1, (int)TM->tm_mday, (int)TM->tm_hour,                    \
        (int)TM->tm_min, (int)TM->tm_sec,                                           \
        (long)timeS.tv_usec);                                                       \
    printf("%s", buff);                                                             \
}

/**
 * 方法名称：printfArray
 * 功能描述：构造器
 * 输入参数：src   // 需要打印的数组指针
 * 输入参数：len   // 需要打印的数据长度
 * 其他说明：本接口输出16进制结果  格式为： aa aa aa aa aa aa aa aa -- aa aa aa aa aa aa aa aa 
 */
//whl 20200701 替换为snprintf
#define printfArray(src, len) {                                                         \
    int i = 0;                                                                          \
    int j = 0;                                                                          \
    char hexS[8192] = {0};                                                              \
    for ( ; i < len / 16; i++ )                                                         \
    {                                                                                   \
        for ( int k = 0; k < 16; k++ )                                                  \
        {                                                                               \
            snprintf(hexS + 3 * j + 29 * i,sizeof(hexS)/sizeof(char), "%02X ", ((unsigned char*)src)[i * 16 + k]); \
            j++;                                                                        \
                                                                                        \
            if (k == 7)                                                                 \
            {                                                                           \
                snprintf(hexS + 3 * j + 29 * i,sizeof(hexS)/sizeof(char), "-- ");                                  \
                j++;                                                                    \
            }                                                                           \
        }                                                                               \
                                                                                        \
        if (16 * (i + 1) != len) {                                                      \
            snprintf(hexS, sizeof(hexS)/sizeof(char),"%s\n                              ", hexS);                  \
        }                                                                               \
    }                                                                                   \
                                                                                        \
    if ( 16 * i < len )                                                                 \
    {                                                                                   \
        for ( int k = 0; k < len - 16 * i; k++ )                                        \
        {                                                                               \
            snprintf(hexS + 3 * j + 29 * i, sizeof(hexS)/sizeof(char),"%02X ", ((unsigned char*)src)[i * 16 + k]); \
            j++;                                                                        \
                                                                                        \
            if (k == 7 && k != len - 16 * i - 1)                                        \
            {                                                                           \
                snprintf(hexS + 3 * j + 29 * i,sizeof(hexS)/sizeof(char), "-- ");                                  \
                j++;                                                                    \
            }                                                                           \
        }                                                                               \
    }                                                                                   \
                                                                                        \
    if (16 * (i + 1) == len) { printfI("%s\n", hexS); }                                 \
    else { printfI("%s\n", hexS); }                                                     \
}
#else  /* defined (DEBUG) */
#define printfI(...)
#define printfE(...)
#define printfArray(src, len)
#endif  /* defined (DEBUG) */

/**
 * PrintHex 定义
 */
#define PrintHex(prom, src, len) { \
    printfI(prom);                 \
    printfArray(src, len);         \
}

#endif /* defined(__Tiny_midware__src__log_h__) */
